const Koa = require('koa')
const app = new Koa()
// 处理跨域问题
var cors = require('koa2-cors')

// cookie存储
var cookieParser = require('cookie-parser');

const views = require('koa-views')
const json = require('koa-json')

// koa自带的错误处理中间件
// const onerror = require('koa-onerror')
// result错误处理中间件，json格式
var error = require('koa-json-error')

// 只支持json/form，不支持文件格式
// const bodyparser = require('koa-bodyparser')
// 既支持json/form，支持文件格式
var koaBody = require('koa-body')

var path = require('path')

// 日志
const logger = require('koa-logger')

// 校验参数
var parameter = require('koa-parameter')

// 链接mongodb
var db = require('./db')

// const index = require('./routes/index')
// const users = require('./routes/users')

// 批量读取路由
var routing = require('./routes')

// error handler
// onerror(app)

// 跨域解決方案一
app.use(async (ctx, next) => {
    //设置允许跨域的域名，*代表允许任意域名跨域
    ctx.set('Access-Control-Allow-Origin', '*');
    ctx.set("Access-Control-Allow-Credentials", "true");
    //允许的header类型
    ctx.set("Access-Control-Allow-Headers", "X-Requested-With");
    ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
    //跨域允许的请求方式 
    ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
    // if (req.method.toLowerCase() == 'options') {
    //     res.send(200);  //让options尝试请求快速结束
    // } else {
    //     await next();
    // }
    await next();
});

// 跨域解決方案二
// app.use(cors())
// app.use(cors({
//     origin: function (ctx) {
//         // if (ctx.url === '/test') {
//             return "*"; // 允许来自所有域名请求
//         // }
//         // return 'http://localhost:8080'; // 这样就能只允许 http://localhost:8080 这个域名的请求了
//     },
//     exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
//     maxAge: 5,
//     credentials: true,
//     allowMethods: ['GET', 'POST', 'DELETE','PUT','PATCH'],
//     allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
// }))
// app.use(cors())
// app.use(cors({
//     origin: '*'
// }))




// 错误处理中间件

app.use(error({
    // 在生产环境下不显示错误堆栈信息，在开发环境下显示错误堆栈信息
    // postFormat定制返回格式
    postFormat: (e, {stack, ...rest}) => {
        console.log(stack);
        console.log(rest);
        return process.env.NODE_ENV === 'production' ? rest : {stack, ...rest}
    }
}))


// middlewares
// app.use(bodyparser({
//   enableTypes:['json', 'form', 'text']
// }))
app.use(koaBody({
    multipart: true,//允许上传图片
    formidable: {
        uploadDir: path.join(__dirname, '/public/uploads'),//上传目录
        keepExtensions: true//保留扩展名
    }
}))

// app.use(cookieParser())
// app.use(async (ctx, next) => {
//     const start = new Date()
//     await next()
//     const ms = new Date() - start
//     console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
// })

// 设置静态文件目录，生成图片链接
app.use(require('koa-static')(__dirname + '/public'))

app.use(json())
app.use(logger())


// app.use(views(__dirname + '/views', {
//     extension: 'pug',
//     // map: {html: 'nunjucks'}
// }))


// logger
// app.use(async (ctx, next) => {
//     const start = new Date()
//     await next()
//     const ms = new Date() - start
//     console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
// })

app.use(parameter(app))

// routes
// app.use(index.routes(), index.allowedMethods())
// app.use(users.routes(), users.allowedMethods())
routing(app)


// error-handling
// app.on('error', (err, ctx) => {
//   console.error('server error',err.message)
// });

module.exports = app
